﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.entities.Validation;
using condortravel.operaciones.entities.Attributes;
using System.Reflection;

namespace condortravel.operaciones.business.Validation
{
    public class FormValidation
    {
        public static bool validate<E> (E entity) where E : class
        {
            System.Reflection.MemberInfo[] CustomerMembers = entity.GetType().GetMembers();
            foreach (System.Reflection.MemberInfo me in CustomerMembers)
            {
                object[] attributes = me.GetCustomAttributes(typeof(DataColumnFileAttribute), true);
                if (attributes != null && attributes.Length > 0)
                {
                    DataColumnFileAttribute dataColumnFile = (DataColumnFileAttribute)attributes[0];
                    if (dataColumnFile.DataType == DataTypeEmum.String)
                    {
                        PropertyInfo property = entity.GetType().GetProperty(me.Name);
                        String value = (String)property.GetValue(entity, null);

                        //chek if the field is required
                        if (dataColumnFile.Required)
                        {
                            if (value == null || value.Equals(string.Empty))
                            {
                                throw new condortravel.operaciones.error.Operaciones.OperacionesException.GeneralException(string.Format("El campo {0} es obligatorio", property.Name));
                            }
                        }

                        //Check data type
                        if (dataColumnFile.DataType == DataTypeEmum.Fecha)
                        { 
                            DateTime outDateTime;
                            if(!DateTime.TryParse(value,out outDateTime))
                            {
                                throw new condortravel.operaciones.error.Operaciones.OperacionesException.GeneralException(string.Format("El campo {0}  debe contener una fecha válida", property.Name));
                            }
                        }

                        if(dataColumnFile.DataType==DataTypeEmum.Hora)
                        {
                        //Falta
                        }
                        if(dataColumnFile.DataType==DataTypeEmum.Integer)
                        {
                            int result;
                            if(!int.TryParse(value, out result))
                            {
                                 throw new condortravel.operaciones.error.Operaciones.OperacionesException.GeneralException(string.Format("El campo {0}  debe contener un número válido", property.Name));
                            }
                        }

                                                if(dataColumnFile.DataType==DataTypeEmum.Hora)
                        {
                        //Falta
                        }
                        if(dataColumnFile.DataType==DataTypeEmum.Long)
                        {
                            long result;
                            if(!long.TryParse(value, out result))
                            {
                                 throw new condortravel.operaciones.error.Operaciones.OperacionesException.GeneralException(string.Format("El campo {0}  debe contener un número válido", property.Name));
                            }
                        }

                        //check the field's size
                        if (value != null)
                        {
                            //different to empty
                            if (!value.Equals(String.Empty))
                            {
                                if (value.Length > dataColumnFile.Size)
                                {
                                    throw new condortravel.operaciones.error.Operaciones.OperacionesException.GeneralException(string.Format("El tamaño máximo del campo {0} es {1}]",property.Name, dataColumnFile.Size));
                                }
                            }
                            else
                            {

                            }
                        }
                        //}//fin datacolumn required
                    }
                }
            }
            return true;
        }
    }
}
